Physics 物理

全局物理属性和辅助方法。

静态变量 说明
AllLayers 选择所有层的层蒙版常量。
bounceThreshold 两个碰撞物体的相对速度如果在这个设定值之下,不会反弹。默认值2.。取值范围0到无穷大。必须为正数。
defaultContactOffset 新创建碰撞器的默认接触偏移值。
DefaultRaycastLayers 选择默认投射层的层蒙版常数。
gravity 场景中应用到所有刚体的重力。
IgnoreRaycastLayer 选择忽略层的层蒙版常量。
queriesHitTriggers 指定查询(raycasts, spherecasts, overlap tests, etc.)是否碰到触发器。
sleepThreshold 质量归一化的能量阈值,低于这个阈值的对象开始休眠。
solverIterationCount 任意刚体默认允许使用的求解迭代次数(默认为7)。必须为正数。
静态方法 说明
BoxCast 沿射线投射立方体,并返回碰到的信息。
BoxCastAll 就像Physics.BoxCast,但返回的是所有碰到的对象信息。
BoxCastNonAlloc 沿方向投射立方体,并储存到提供的缓冲器(RaycastHit)。返回碰到的储存在results缓冲器中的数量。
CapsuleCast 在场景中针对所有碰撞器投射一个胶囊,并返回碰到的细节信息。
CapsuleCastAll 像Physics.CapsuleCast,但这个函数将返回所有胶囊扫描交叉碰到的对象。
CapsuleCastNonAlloc 针对场景中所有的碰撞器投射一个胶囊,并返回缓冲器中碰到什么的信息。
CheckBox 检测给定盒是否与其他碰撞器重叠。
CheckCapsule 在世界坐标空间,检查胶囊体是否与任意碰撞器重叠。
CheckSphere 在世界坐标空间,由位置和半径定义的球与任意碰撞器重叠,如果返回true。
GetIgnoreLayerCollision layer1和layer2的层的碰撞时否忽略?
IgnoreCollision 使碰撞检测系统忽略所有collider1和collider2碰撞。
IgnoreLayerCollision 使碰撞检测系统忽略layer1和layer2中的任意碰撞器的所有碰撞。
Linecast 在线的开始和结束位置之间,如果与任何碰撞器相交返回真。
OverlapBox 查找给定立方体内或与之接触的所有碰撞器。
OverlapBoxNonAlloc 查找给定立方体内或与之接触的所有碰撞器,并储存在缓冲器中。
OverlapSphere 返回球内或与之接触的所有碰撞器。
OverlapSphereNonAlloc 计算并储存该球内或与之接触的所有碰撞器到提供的缓冲器中。
Raycast 在场景中投下可与所有碰撞器碰撞的一条光线。注意:如果射线从碰撞体的内部或者背面打,Raycast不检测碰撞。
RaycastAll 在场景投射一条射线并返回所有碰撞。注意不保证顺序。
RaycastNonAlloc 在场景投射射线并储存碰到的对象到缓冲器中。
SphereCast 沿着射线方向投射一个球形,并返回更多的碰到的信息。
SphereCastAll 类似Physics.SphereCast,但是这个函数返回所有球形扫描到的碰撞信息。
SphereCastNonAlloc 沿direction方向投射球体,并储存在results缓冲器中。

示例:

Physics.Raycast 射线投射

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour {
        void Update() {
            Vector3 fwd = transform.TransformDirection(Vector3.forward);
            if (Physics.Raycast(transform.position, fwd, 10))
                print("There is something in front of the object!");

        }
    }

注意:如果射线从碰撞体的内部或者背面打,Raycast不检测碰撞。如果你用脚本或动画移动碰撞器,需要至少一个在FixedUpdate执行,因为物理库能更新它的数据结构,因此一条射线在它的新位置之前打到碰撞器。

    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour {
        void Update() {
            RaycastHit hit;
            if (Physics.Raycast(transform.position, -Vector3.up, out hit))
                float distanceToGround = hit.distance;

        }
    }
    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour {
        void Update() {
            RaycastHit hit;
            if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0F))
                float distanceToGround = hit.distance;

        }
    }
    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour {
        void Update() {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, 100))
                print("Hit something");

        }
    }
    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour {
        void Update() {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 100))
                Debug.DrawLine(ray.origin, hit.point);

        }
    }

Physics.CapsuleCast 胶囊投射

public static bool CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

参数 说明
point1 球体开始中心点。
point2 球体结束的中心点。
radius 胶囊的半径。
direction 胶囊扫描的方向。
maxDistance 扫描的最大长度。
hitInfo hitInfo包含更多的碰到碰撞器的信息。
layerMask 选择投射的层蒙版。
queryTriggerInteraction 指定是否查询碰到触发器。

返回值:胶囊扫描到任意交叉碰撞器返回true,否则返回false。

胶囊是由radius半径与point1和point2位置的两个球形成胶囊的两端定义。返回胶囊沿direction方向碰到的第一个碰撞器。这通常用于投射不需足够的精度,因为你要找出一个特定大小的物体,如人物,能移动到某处而不在途中碰撞到任何东西。

注意,胶囊投射不检测胶囊重叠的碰撞器。如果从脚本或动画移动碰撞器,需要有至少一个在FixedUpdate中执行,使得物理库可以更新它的数据结构,在CapsuleCast碰到碰撞器之前是在它的新位置。

    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour {
        void Update() {
            RaycastHit hit;
            CharacterController charContr = GetComponent<CharacterController>();
            Vector3 p1 = transform.position + charContr.center + Vector3.up * -charContr.height * 0.5F;
            Vector3 p2 = p1 + Vector3.up * charContr.height;
            float distanceToObstacle = 0;

            // Cast character controller shape 10 meters forward to see if it is about to hit anything.
            if (Physics.CapsuleCast(p1, p2, charContr.radius, transform.forward, out hit, 10))
                distanceToObstacle = hit.distance;
        }
    }